#include <Wire.h>
#include <Adafruit_INA219.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_INA219 ina219;

void setup(void) 
{
  Serial.begin(115200);
  Wire.setPins(16,17);
  Wire.begin();
    
  if(!display.begin(SSD1306_SWITCHCAPVCC,0x3C)){
    Serial.println(F("SSD1306 failed"));
    while(1);
  }
  Serial.println("OLED OK");
  
  if (! ina219.begin(&Wire)) {
    Serial.println("Failed to find INA219 chip");
    while(1);
  }
  Serial.println("INA OK");
  
  display.clearDisplay();
  display.setTextSize(1); // 统一使用小字体
  display.setTextColor(SSD1306_WHITE);
}

void loop(void) 
{
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  display.clearDisplay();
  
  // 进一步右上角集中布局
  int startX = SCREEN_WIDTH - 64; // 向右上角偏移
  int startY = 2;
  
  // 使用缩写和更小的间距
  display.setCursor(startX, startY);
  display.print("V:");
  display.setCursor(startX + 15, startY); // 固定位置对齐
  display.print(loadvoltage, 2);
  display.print("V");
  
  display.setCursor(startX, startY + 10); // 行高减小为10像素
  display.print("I:");
  display.setCursor(startX + 15, startY + 10);
  display.print(current_mA, 0); // 电流取整显示
  display.print("mA");
  
  display.setCursor(startX, startY + 20);
  display.print("P:");
  display.setCursor(startX + 15, startY + 20);
  display.print(power_mW / 1000.0, 2); // 功率保留2位小数
  display.print("W");
  
  display.setCursor(startX, startY + 30);
  display.print("T:");
  display.setCursor(startX + 15, startY + 30);
  display.print(millis() / 1000);
  display.print("s");
  
  display.display();

  delay(1000);
}    